/* -----------------------------------------------------------------------
 *   Copyright (C) 2008 by Denjs
 *   dplsoft@pisem.net
 *   http://qdroid.berlios.de
 * -----------------------------------------------------------------------
 *   This program is free software licensed under GNU GPL License v.2 ; see main.cpp fo details
 *   Эта программа является свободным программным обеспечением; распространяемым под
 *   лицензией GNU General Public License v.2 (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU версия 2.0) 
 * ----------------------------------------------------------------------- */
/*
 * t_FileListElement.h
 *
 *  Created on: 21.11.2008
 *      Author: Denjs
 *
 *
 *      ver 2008.11.25
 *      	ver 2008.11.23
 */

#ifndef t_FileListElement_H_
#define t_FileListElement_H_

#include "t_AbstractQDroidBot.h"
#include "t_TreeWidgetItem.h"
 #include <QTreeWidget>

/*
 Класс для обработки элемента списка файлов.
 Наследуем от "абстрактного бота"

TODO сделать класс абстрактным элеентом списка с произвольным чилдом атрибутов\
     возможно - как-то ввести ссылку на фикс. список атрибутов в головном спискеЭлементов ?


*/

class t_FileListElement : public t_AbstractQDroidBot
{
    Q_OBJECT
	Q_PROPERTY(QString FileFullName READ get_file_full_name WRITE set_file_full_name);
	Q_PROPERTY(QString Note1 READ get_note1 WRITE set_note1);
	Q_PROPERTY(QString Note2 READ get_note2 WRITE set_note2);
	Q_PROPERTY(QString Path READ get_path WRITE set_path);
/*!*/	Q_PROPERTY(QString RelativePath READ get_relpath WRITE set_relpath)
/*!*/	Q_PROPERTY(QString ID READ get_id WRITE set_id)

	/* ПОСЛЕ ДОБАВЛЕКНИЯ СВОЙСТВА ИЛИ АТРИБУТА!
	 * ПРАВЬ КОНСТРУКТОРЫ КОПИРОВАНИЯ И ПРИСВАИВАНИЯ!!!!
	 */

    public:
    	// удобно уметь создаваться с пустым родителем
    	t_FileListElement(QObject *parent=0);
    	//это (ниже) нужно что бы можно было засунуть t_FileListElement в контейнер QList
    	// возможно так-же связано с работой QtScript движка - см функции после определения класса
    	// спец. настройки для QtScript (v 2008.11.25)
    	// Шаг 1 из 8
    	t_FileListElement(const t_FileListElement &other);
    	//это (ниже) нужно что бы можно было засунуть t_FileListElement в контейнер QList
    	// возможно так-же связано с работой QtScript движка - см функции после определения класса
    	// спец. настройки для QtScript (v 2008.11.25)
    	// Шаг 2 из 8
    	t_FileListElement& operator=(const t_FileListElement &other);

    	// а это нужно для добавления в QSet (шаг 2.2)
    	bool operator==(const t_FileListElement &other) const;

    	t_FileListElement* copy();//костыли в рузультуате того что регистрируем ссылку а не сам тип для движка

    	QString FileFullName_inc;
    	QString Note1_inc;
    	QString Note2_inc;
    	QString Path_inc;
    	QString RelativePath_inc;
    	QString ID_inc; // идентификатор. понему производится сравнение, поиск идентификация в QSet
					// по нему рассчитывается и QHash(t_FileListElement)
    	QString Parent_ID_inc;

    	//TODO: ввести запись/сохранение данных элементов
    	bool IsDir; // это каталог
    	bool IsReadOnly; // только для чтения
    	bool IsSpecified; // специфический (например введен исскуственно)

    	QMap<QString,QString> Properties; //множество свойств которые мы можем определить для элемента

    public slots:
		QString std_in(QString Message); // needs to be redefined to make real class
		QString get_file_full_name();
		QString set_file_full_name(QString _FileFullName);
		QString get_note1();
		QString set_note1(QString _Note1);
		QString get_note2();
		QString set_note2(QString _Note2);
		QString get_path();
		QString set_path(QString _Note2);
		QString get_relpath();
		QString set_relpath(QString _Note2);
		QString get_id();
		QString set_id(QString _Note2);

		//QTreeWidgetItem* create_tree_widget_item();//создаем элемент отображдения для дерева
		//создаем элемент отображдения для дерева.
		// заполнять колонки в соответствии со списком атрибутов
		// перечисленных через зпт.
		t_TreeWidgetItem* create_tree_widget_item(QString PropertyOrder="");

		// операции с произвольным списком свойств
		// (у каждого элемента может быть произвольный список свойств)
		// TODO сделать сохранение этих свойств в XML
		QString get_property(QString _ValueName);
		QString set_property(QString _ValueName,QString _ValueVar);
		bool is_property_contains(QString _ValueName);
		int rename_property(QString _ValueNameOld,QString _ValueNameNew, bool Replace=true);
		int remove_property(QString _ValueName);
		int remove_all_properties();
		int property_count();
		QString get_property_name(int _index); //по индексу - получить свойство
		QString get_property_value(int _index);//по индексу - получить значение

	signals:

    private:
};

//нужно чтобы можно было передавать эти элементы как параметры в функции внутри QtScript
// спец. настройки для QtScript (v 2008.11.25)
// Шаг 3 из 8
Q_DECLARE_METATYPE(t_FileListElement*);
Q_DECLARE_METATYPE(t_FileListElement);
//Q_SCRIPT_DECLARE_QMETAOBJECT(t_FileListElement,QObject*);

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 4 из 8
static QScriptValue qdroid_t_FileListElement_toScriptValue(QScriptEngine *engine, t_FileListElement* const &in)
{ return engine->newQObject(in); }

static QScriptValue qdroid_t_FileListElementO_toScriptValue(QScriptEngine *engine, t_FileListElement const &in)
{
//	t_FileListElement inner_in;
//	inner_in=in;
//	//return engine->newQObject(&t_FileListElement(in));
//	//return engine->newQObject( qobject_cast<t_FileListElement>(in) );
//	return engine->newQObject( &inner_in );
//	return engine->newVariant(qVariantFromValue(in));
	return engine->newQObject((QObject*)&in);
}

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 5 из 8
static void qdroid_t_FileListElement_fromScriptValue(const QScriptValue &object, t_FileListElement* &out)
{ out = qobject_cast<t_FileListElement*>(object.toQObject()); }

static void qdroid_t_FileListElementO_fromScriptValue(const QScriptValue &object, t_FileListElement &out)
{
	//TODO по идее - надо бы пробежаться по метаданным и заполнить поля в соотв. со списоком свойств...
	// но пока путь будет так...
	out.FileFullName_inc	=object.property("FileFullName_inc").toString();
	out.Note1_inc			=object.property("Note1_inc").toString();;
	out.Note2_inc			=object.property("Note2_inc").toString();;
	out.Path_inc			=object.property("Path_inc").toString();;
	out.RelativePath_inc	=object.property("RelativePath_inc").toString();;
	out.ID_inc			=object.property("ID_inc").toString();;
}

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 6 из 8
//конструктор для последующего его определения как new в скрипте
static QScriptValue qdroid_t_FileListElement_constructor(QScriptContext *QSContext, QScriptEngine *QSEngine)
	{
		//t_BaseBot BaseBot;
		QScriptValue QtSObject;
		QtSObject=QSEngine->newQObject(new t_FileListElement()); //
		//qsBaseBot=QSEngine->toScriptValue(BaseBot);
		return QtSObject;
	}

// спец. настройки для QSet (v 2008.11.25)
// нужен для того что бы мы могли пересекать множества в t_FileList
static uint qHash ( const t_FileListElement &key )
{
	return qHash(key.ID_inc);
};

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 7 из 8
// - это qScriptRegisterMetaType регистрация но это нужно сделать в головном классе
// например в глобальной функции "define__qdroid_qtscript_functions()"
//// t_FileListElement TYPE defenition
//	qScriptRegisterMetaType(_QSEngine, qdroid_t_FileListElement_toScriptValue, qdroid_t_FileListElement_fromScriptValue);
//  qScriptRegisterMetaType(_QSEngine, qdroid_t_FileListElementO_toScriptValue, qdroid_t_FileListElementO_fromScriptValue);

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 8 из 8
//- определение конструктора в контексте скрипта
//// t_FileListElement NEW constructor defenition
//	QScriptValue fun4_constr = _QSEngine->newFunction(qdroid_t_FileListElement_constructor);
//	_QSEngine->globalObject().setProperty("t_FileListElement", fun4_constr);



		//==[QTreeWidgetItem*]====================================================
		Q_DECLARE_METATYPE(QTreeWidgetItem*);

/*
	// спец. настройки для QtScript (v 2008.11.25)
		// Шаг 4 из 8
		static QScriptValue qdroid_QTreeWidgetItemP_toScriptValue(QScriptEngine *engine, QTreeWidgetItem* const &in)
		{ return engine->newQObject(in); }

		// спец. настройки для QtScript (v 2008.11.25)
		// Шаг 5 из 8
		static void qdroid_QTreeWidgetItemP_fromScriptValue(const QScriptValue &object, QTreeWidgetItemW* &out)
		{ out = qobject_cast<QTreeWidgetItemW*>(object.toQObject()); }

		// спец. настройки для QtScript (v 2008.11.25)
		// Шаг 6 из 8
		//конструктор для последующего его определения как new в скрипте
		static QScriptValue qdroid_QTreeWidgetItemP_constructor(QScriptContext *QSContext, QScriptEngine *QSEngine)
			{
				//t_BaseBot BaseBot;
				QScriptValue QtSObject;
				QtSObject=QSEngine->newQObject(new QTreeWidgetItemW()); //
				//qsBaseBot=QSEngine->toScriptValue(BaseBot);
				return QtSObject;
			}

		//// at global_qs_functions.h ::
		//// QTreeWidget* TYPE defenition
		//	qScriptRegisterMetaType(_QSEngine, qdroid_QTreeWidgetItemP_toScriptValue, qdroid_QTreeWidgetItemP_fromScriptValue);

		//// QTreeWidget* NEW constructor defenition
		//	QScriptValue QTreeWidgetItemP_constr = _QSEngine->newFunction(qdroid_QTreeWidgetItemP_constructor);
		//	_QSEngine->globalObject().setProperty("QTreeWidgetItem", QTreeWidgetItemP_constr);
*/

//=================================================================

#endif /* t_FileListElement_H_ */
